﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Framework.AcessoDados.Acesso;
using Framework.Entidade.Acesso;
using Framework.Util.Enumerador;
using System.Configuration;

namespace Framework.LogicaNegocio.Acesso
{
    public class LN_Grupo
    {
        #region Métodos

        /// <summary>
        /// Método responsável pela listagem de todos os Grupos já cadastrados conforme filtro
        /// </summary>
        /// <param name="nome">Nome do Grupo</param>
        /// <param name="status">Status do Grupo</param>
        /// <returns>Lista de Objetos EN_Grupo preenchidos</returns>
        public List<EN_Grupo> Listar(string nome, string status)
        {
            AD_Grupo objGrupoAD = new AD_Grupo();
            List<EN_Grupo> lstGrupos = new List<EN_Grupo>();

            try
            {
                lstGrupos = objGrupoAD.Listar(nome, status);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return lstGrupos;
        }

        /// <summary>
        /// Método responsável pelo retorno do Grupo desejado
        /// </summary>
        /// <param name="id">id do Grupo</param>
        /// <returns>Objeto EN_Grupo preenchido</returns>
        public EN_Grupo RetornarGrupo(int id)
        {
            AD_Grupo objGrupoAD = new AD_Grupo();
            EN_Grupo objGrupo = new EN_Grupo();

            try
            {
                if(id <= 0)
                    throw new Exception("Informe o Id do Grupo.");

                objGrupo = objGrupoAD.RetornarGrupo(id);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return objGrupo;
        }

        /// <summary>
        /// Método responsável por Salvar o Grupo no Banco de Dados
        /// Insere ou Altera
        /// </summary>
        /// <param name="objGrupo">Objeto Grupo preenchido</param>
        /// <returns>Id do Grupo</returns>
        public int Salvar(EN_Grupo objGrupo)
        {
            AD_Grupo objGrupoAD = new AD_Grupo();
            int idGrupo = 0;

            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["FrameworkConnectionDev"].ConnectionString))
            {
                conn.Open();
                //Iniciando uma transação
                SqlTransaction trans = conn.BeginTransaction();

                try
                {
                    if (objGrupo == null)
                        throw new Exception("Preencha as informações do Grupo.");
                    if (string.IsNullOrEmpty(objGrupo.Nome) == true)
                        throw new Exception("Informe o Nome do Grupo.");
                    if (string.IsNullOrEmpty(objGrupo.Descricao) == true)
                        throw new Exception("Informe a Descrição do Grupo.");

                    idGrupo = objGrupoAD.Salvar(objGrupo, conn, trans);

                    trans.Commit();
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    throw ex;
                }

                conn.Close();
            }

            return idGrupo;
        }

        /// <summary>
        /// Método responsável por Excluir/Inativar o Grupo desejado
        /// </summary>
        /// <param name="id">id do Grupo</param>
        public void Excluir(int id)
        {
            AD_Grupo objGrupoAD = new AD_Grupo();

            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["FrameworkConnectionDev"].ConnectionString))
            {
                conn.Open();
                //Iniciando uma transação
                SqlTransaction trans = conn.BeginTransaction();

                try
                {
                    if (id <= 0)
                        throw new Exception("Informe o Id do Grupo.");

                    objGrupoAD.Excluir(id, conn, trans);
                    trans.Commit();
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    throw ex;
                }

                conn.Close();
            }
        }

        #endregion
    }
}
